// ABC413 G  V2并查集方案
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5; // 定义最大点数
int father[N], tg[N];      // father:并查集父节点, tg:标记数组

// 并查集查找函数，带路径压缩
int find(int x) {

  if (father[x] == x)
    return x;

  int root = find(father[x]);
  father[x] = root;
  return root;
}
// 并函数
void merge(int x, int y) {
  int rootx = find(x);
  int rooty = find(y);
  if (rootx == rooty) // 如果已经在同一集合则跳过
    return;
  father[rootx] = rooty; // 合并两个集合
}

// 8个方向的偏移量：上下左右+四个对角线方向
int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[8] = {0, 1, 0, -1, 1, -1, 1, -1};

pair<int, int> a[N];         // 存储每个点的坐标
map<pair<int, int>, int> id; // 坐标到点编号的映射

signed main() {
  int n, m, k;        // n,m:网格大小, k:点数,
  cin >> n >> m >> k; // 输入网格大小和点数

  // 输入所有点并初始化并查集
  for (int i = 1; i <= k; ++i) {
    cin >> a[i].first >> a[i].second; // 输入坐标
    id[a[i]] = i;                     // 建立坐标到编号的映射
    father[i] = i;                        // 初始化并查集，每个点自成一个集合
  }

  // 遍历所有点，检查8邻域内的点并合并
  for (int i = 1; i <= k; ++i) {
    // int x = a[i].first;
    // int y = a[i].second;
    int x, y;
    tie(x, y) = a[i];
    for (int j = 0; j < 8; ++j) {
      int xx = x + dx[j];
      int yy = y + dy[j];
      auto it = id.find({xx, yy});
      if (it != id.end())     // 如果邻域有点存在
        merge(i, it->second); // 合并这两个点
    }
  }

  // 标记所有位于底部或左边缘的点所在的集合
  for (int i = 1; i <= k; ++i)
    if (a[i].first == n || a[i].second == 1) // 底部或左边缘
      tg[find(i)] = 1;                       // 标记该集合

  int flag = 1;
  // 检查是否有顶部或右边缘的点与底部/左边缘的点连通
  for (int i = 1; i <= k; ++i)
    if ((a[i].first == 1 || a[i].second == m) && tg[find(i)]) {
      flag = 0; // 如果连通则设置标志为0
      break;
    }

  // 输出结果：如果没有连通则输出Yes，否则输出No
  if (flag)
    cout << "Yes";
  else
    cout << "No";
  return 0;
}